/**
 * system.h
 * Interface untuk modul system
 * Modul system berfungsi untuk mengendalikan semua proses yang berhubungan dengan sistem program
 * Seperti: pembacaan perintah, eksekusi perintah, pembacaan dari file, penanganan query
 * Fri, 4 Dec 2009
 * By Karol Danutama 13508040
 * */


#ifndef system_h
#define system_h

#include "../mesinkata/mesinkata.h"
#include "../graphmanager/graphmanager.h"
#include<stdio.h>

//
#define MaxArgument 25 //jumlah argumen maksimum dalam 1 perintah
#define forup(i,a,b) for(i=a ; i<=b ; i++)


typedef struct {
	string argument[MaxArgument];
	int nArgument;
} Command;
//TIPE COMMAND: menyimpan perintah dan argumen - argumen yang diberikan di kedua modus

Command command;
//variabel yang berisi perintah dan argumen dari pengguna

//SELEKTOR
#define nArgument(a) (a).nArgument
#define Argument(a , i) (a).argument[i]

int modus; //penanda modus yang sedang berjalan 1: modus persiapan 2: modus operasional
int currentNode; //penanda node/site yang sedang diproses dalam modus 2
string currentFile; //penanda file yang sedang dibuka dalam modus 1


/**PSEUDOCONSTANT**/
string LoadCommand , OpenCommand , SaveCommand , AddSiteCommand , AddConnCommand , CreateCommand , ResetCommand , ListCommand , ExitCommand;
//penyimpan string perintah yang tersedia pada modus 1

string ArgSites , ArgConnections , ArgServers , ArgClients , ArgTables , ArgASC , ArgDESC , ArgAll;
//Argumen - argumen pada perintah list

string RetrieveCommand , InsertCommand , DeleteCommand , UpdateCommand , CloseCommand;
//penyimpan string perintah yang tersedia pada modus 2

string StudentsTable , LecturesTable , Lectures_StudentsTable;
//penyimpan nama tabel

string NULLValue;
/**END-PSEUDOCONSTANT**/


void AssignConstantValue();
/**
 * I.S: sembarang
 * F.S: nilai - nilai pseudoconstant terisi
 * Memberikan nilai pada variabel - variabel PSEUDOCONSTANT. Dipanggil saat program dijalankan
 * */

void SetError(int ErrCode);
/**
 * I.S: ErrCode sembarang, tidak boleh di luar batasan error code yang terdefinisi
 * F.S: Tercetak pesan kesalahan
 * Mengeluarkan error message sesuai dengan error code yang telah ditentukan
 * */

void CreateEmptyCommand(Command *c);
/**
 * I.S: c terdefinisi
 * F.S: c terisi sebagai command kosong
 * Membuat variabel penampung command kosong. Dipanggil di awal program
 * */
 
string MergeString(int *iterator , Command a);
/**
 * Menggabungkan nilai yang diapit "" menjadi 1 token argumen
 * */

Command ReadCommand(FILE *f , int modus , TNodeList *NodeList , int currentNode);
/**
 * Membaca command dari masukkan pengguna. Command juga dapat dimasukkan dari file dengan menambahkan parameter *f
 * */

Command MergeArguments(Command c);
/**
 * Membersihkan 1 baris perintah yang mengandung string ("")
 * */
 
Command ReadArguments(FILE *f);
/**
 * Membaca argumen - argumen pada file eksternal utama
 * */

void ExecuteCommand(int *modus , TNodeList *NodeList , TAdjMatrix m , TAdjList *a , int *currentNode , string *currentFile);
/**
 * I.S: modus terdefinisi antara 1 dan 2, NodeList,m,currentNode,currentFile terdefinisi
 * F.S: Perintah dijalankan
 * Menjalankan perintah yang ditampung di variabel command
 * */

void ReadExternalStructure(FILE *f , TNodeList *nodes , TAdjMatrix m , TAdjList *AdjList);
/**
 * I.S: f, nodes, m, AdjList terdefinisi
 * F.S: Struktur eksternal yang ditandai oleh f terbaca dan tersimpan dalam *nodes , n , *AdjList
 * Membaca data dari struktur eksternal dan menyimpan dalam struktur data internal
 * */

void WriteToExternalStructure(FILE *f , TNodeList *nodes , TAdjMatrix m , TAdjList AdjList);
/**
 * I.S: f, nodes, m, AdjList terdefinisi
 * F.S: Struktur eksternal yang ditandai oleh f terisi dengan *nodes , n , AdjList
 * Menulis isi struktur internal ke struktur eksternal
 * */

void ParseCondition(Command c , int start , string cond[MaxConditionArgs] , int *ncond);
/**
 * I.S: c, start, cond, ncond terdefinisi
 * F.S: Kondisi setelah argument WHERE terbaca dan tersimpan dalam cond dan ncond
 * Mengambil pernyataan kondisi dari sesudah argumen WHERE
 * */

//QUERY HANDLER
void Retrieve(Command C , TAdjMatrix *m , TNodeList *NodeList , int currentNode);
/**
 * I.S: C, *m , *NodeList , currentNode terdefinisi
 * F.S: perintah retrieve dijalankan
 * Menangani perintah retrieve
 * */

void Insert(Command C , TAdjMatrix *m , TNodeList *NodeList , int currentNode);
/**
 * I.S: C, *m , *NodeList , currentNode terdefinisi
 * F.S: perintah insert dijalankan
 * Menangani perintah insert
 * */

void Update(Command C , TAdjMatrix *m , TNodeList *NodeList , int currentNode);
/**
 * I.S: C, *m , *NodeList , currentNode terdefinisi
 * F.S: perintah update dijalankan
 * Menangani perintah update
 * */

void Delete(Command C , TAdjMatrix *m , TNodeList *NodeList , int currentNode);
/**
 * I.S: C, *m , *NodeList , currentNode terdefinisi
 * F.S: perintah delete
 *  dijalankan
 * Menangani perintah delete
 * */

#endif
